<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8" />
    <title>06-new运算符作用</title>
</head>

<body>
    <script>
        function Person(name, age) {
            this.name = name;
            this.age = age
            // return {}
        }
        // let p = new Person('小明', 20)


        /* 
        自定义new工具函数
        语法: newInstance(Fn, ...args)
        功能: 创建Fn构造函数的实例对象
        实现: 创建空对象obj, 调用Fn指定this为obj, 返回obj
        */
        function newInstance(Fn, ...args) {
            //1、 创建一个新的对象
            const obj = {}
            // 2、执行构造函数,并且强行改变构造函数的this指向
            const result = Fn.apply(obj, args) // 相当于: obj.Fn()
            // 3、如果构造函数执行的结果是对象, 返回这个对象
            if (result instanceof Object) {
                return result
            }

            // 4、 给obj指定__proto__为Fn的prototype
            obj.__proto__ = Fn.prototype
            // 5、 返回新创建的对象
            return obj
        }

        let result = newInstance(Person, '小明', 20)
        console.log(result)
    </script>
</body>

</html>